package entity

import (
	"encoding/json"
	"time"

	"github.com/google/uuid"
	"gorm.io/datatypes"
	"techoiceness.com/aiagent/llm-gateway/internal/llm/types"
)

// LLMMessage LLM直接交互消息表，用于AI多轮对话上下文
// 只包含LLM交互必需的字段，保持简洁
type LLMMessage struct {
	ID             uuid.UUID `gorm:"primaryKey;type:uuid;column:id;default:uuid_generate_v4()"`
	ConversationID uuid.UUID `gorm:"type:uuid;column:conversation_id;not null;index"`
	CreatedAt      time.Time `gorm:"column:created_at;autoCreateTime"`

	// LLM交互核心字段
	Role    types.Role `gorm:"column:role;not null"`    // "user", "assistant", "system", "tool"
	Content string     `gorm:"column:content;not null"` // 消息内容

	// 可选字段（仅在需要时使用）
	Name             string         `gorm:"column:name"`                 // 消息发送者名称（tool消息使用）
	ReasoningContent string         `gorm:"column:reasoning_content"`    // 推理过程内容（如果LLM支持）
	ToolCallID       string         `gorm:"column:tool_call_id"`         // 工具调用ID（tool消息使用）
	ToolCalls        datatypes.JSON `gorm:"column:tool_calls;type:json"` // 工具调用详情（assistant消息使用）

	// 对话轮次ID，用于关联一轮完整对话的所有相关消息
	// 与ClientMessage中的ConversationRoundID保持一致，用于串联：
	// 1. 用户的ClientMessage
	// 2. 助手的ClientMessage
	// 3. 这轮对话产生的所有LLMMessage（包括工具调用等）
	ConversationRoundID uuid.UUID `gorm:"type:uuid;column:conversation_round_id;index"`

	// LLM响应详细信息
	FinishReason     string `gorm:"column:finish_reason"`      // 完成原因：stop, length, tool_calls, content_filter等
	Model            string `gorm:"column:model"`              // 使用的具体模型名称
	PromptTokens     int    `gorm:"column:prompt_tokens"`      // 提示词token数量
	CompletionTokens int    `gorm:"column:completion_tokens"`  // 生成内容token数量
	TotalTokens      int    `gorm:"column:total_tokens"`       // 总token数量
	ProcessingTime   int64  `gorm:"column:processing_time_ms"` // 处理时间（毫秒）
	RawRequestBody   string `gorm:"column:raw_request_body"`   // 原始HTTP请求体
	RawResponseBody  string `gorm:"column:raw_response_body"`  // 原始HTTP响应体
}

// TableName specifies the table name for the LLMMessage model.
func (LLMMessage) TableName() string {
	return "llm_messages"
}

// ToProviderMessage 转换为Provider消息格式
func (m *LLMMessage) ToProviderMessage() types.Message {
	result := types.Message{
		Content:          m.Content,
		Name:             m.Name,
		Role:             types.Role(m.Role),
		ToolCallID:       m.ToolCallID,
		ReasoningContent: m.ReasoningContent,
	}

	if m.ToolCalls != nil {
		var toolCalls []types.ToolCall
		if err := json.Unmarshal(m.ToolCalls, &toolCalls); err == nil {
			result.ToolCalls = toolCalls
		}
	}

	return result
}

// LLMMessageMetadata LLM消息元数据
type LLMMessageMetadata struct {
	FinishReason     string
	Model            string
	PromptTokens     int
	CompletionTokens int
	TotalTokens      int
	ProcessingTime   int64  // 毫秒
	RawRequestBody   string // 原始HTTP请求体
	RawResponseBody  string // 原始HTTP响应体（非流式）或组装的响应体（流式）
}
